package main.leetcode.clockin.April;

/**
 * 151.反转字符串里的单词
 *
 * <p>给定一个字符串，逐个翻转字符串中的每个单词。
 *
 * <p>
 *
 * <p>示例 1：输入: "the sky is blue" 输出: "blue is sky the"
 *
 * <p>示例 2：输入: "  hello world!  " 输出: "world! hello" 解释: 输入字符串可以在前面或者后面包含多余的空格，但是反转后的字符不能包括。
 *
 * <p>示例 3：输入: "a good   example" 输出: "example good a" 解释: 如果两个单词间有多余的空格，将反转后单词间的空格减少到只含一个。
 *
 * <p>说明：无空格字符构成一个单词。 输入字符串可以在前面或者后面包含多余的空格，但是反转后的字符不能包括。 如果两个单词间有多余的空格，将反转后单词间的空格减少到只含一个。
 *
 * <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/reverse-words-in-a-string
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class day10 {
    public static void main(String[] args) {
        System.out.println(new day10().reverseWords("aaa "));
    }

    //    public String reverseWords(String s) {
    //        int n = s.length();
    //        // 特判
    //        if (n == 0) return "";
    //
    //        StringBuilder res = new StringBuilder();
    //        char[] chars = s.toCharArray();
    //
    //        // tail记录单词尾部下标（+1）
    //        int tail = n;
    //        for (int i = n - 1; i >= 1; --i) {
    //            // 单词尾部（abc+‘ ’）
    //            if (chars[i] == ' ' && chars[i - 1] != ' ') tail = i;
    //            // 单词首部（‘ ’+abc），加入单词
    //            if (chars[i] != ' ' && chars[i - 1] == ' ') {
    //                res.append(' ').append(String.valueOf(chars, i, tail - i));
    //            }
    //        }
    //        // 特殊判断，字符串开头的第一个单词要另外记录
    //        // 例如"abc "，在上述的循环中只能记录尾部而无法记录首部，从而无法append
    //        if (chars[0] != ' ') {
    //            res.append(' ').append(String.valueOf(chars, 0, tail));
    //        }
    //        // 除去第一个‘ ’
    //        return res.length() > 0 ? res.deleteCharAt(0).toString() : "";
    //    }

    public String reverseWords(String s) {
        int n = s.length();
        // 特判
        if (n == 0) {
            return "";
        }

        StringBuilder res = new StringBuilder();
        char[] chars = s.toCharArray();

        int tail = n - 1;
        for (int i = n - 1; i >= 1; --i) {
            // 单词末尾
            if (chars[i] == ' ' && chars[i - 1] != ' ') {
                tail = i - 1;
            }
            // 单词开头
            if (chars[i] != ' ' && chars[i - 1] == ' ') {
                res.append(' ').append(String.valueOf(chars, i, tail - i + 1));
            }
        }
        if (chars[0] != ' ') {
            res.append(' ').append(String.valueOf(chars, 0, tail + 1));
        }
        return res.deleteCharAt(0).toString();
    }
}
